//#ifdef APP-PLUS
const quantum = uni.requireNativePlugin('Quantum')
// import { Base64 } from 'js-base64';
//#endif
/*
获取全局配置需要量子传输的接口
传入当前url 返回true配置了量子
*/
function qssList(url) {
	let quantumApis = []
	try {
		quantumApis = uni.getStorageSync('storage_key');
		console.log('获取到配置量子接口', quantumApis);
	} catch (e) {
		// error
	}
	//当前url是不是配置量子
	let boole = quantumApis.includes(url)
	return boole
}
/*
国科量子解密 图片
需要传入解密的字符串和秘钥secretKey
*/
async function SM4DecryptBigData(secretData, secretKey) {
	console.log('国科量子解密');
	let session=init()
	//secretData 是一个gk的URL
	//1 下载secretData
	let download =await download_data(secretData)
	//2 读取stream
	//读取文件流以url编码读取文件
	let fileStream=await readAsDataURL(download.tempFilePath)
	console.log(fileStream.slice(0,55));
	// 3 base64解码
	let stream=quantum.Base64Decode(str)
	
	let str = quantum.SM4DecryptBigData(session, stream, secretKey); //解密
	console.log(session+'----------session-------------',stream.length+'---------stream.length----------',secretKey+'-------------secretKey-----------');
	console.log('解密结果',str.length,quantum.logError());
	let base64 ='data:image/png;base64,'+str.data
	return base64
}
/*
国科量子解密 附件【加密柜,邮箱】
需要传入解密的字符串和秘钥secretKey
*/
async function SM4DecryptBigDataEnclosure(secretData, secretKey) {
	console.log('国科量子解密');
	let session=init()
	//secretData 是一个gk的URL
	//1 下载secretData
	let download =await download_data(secretData)
	//2 读取stream
	//readAsText文本格式读取文件内容有阻塞问题，使用readAsDataURL url编码格式进行读取文件内容，读取后进行base64解码得到真实文件加密内容
	let fileStream=await readAsDataURL(download.tempFilePath)
	console.log(fileStream.slice(0,55));
	// 3 base64解码得到真实文件加密内容
	fileStream=quantum.Base64Decode(fileStream)
	console.log(session+'----------session-------------',fileStream.length+'---------fileStream.length----------',secretKey+'-------------secretKey-----------');
	//4量子解密
	let str = quantum.SM4DecryptBigData(session, fileStream, secretKey); //解密
	console.log('解密结果',str.length,quantum.logError());
	if(str.length<0){
		uni.showToast({
			title: '解密异常，'+quantum.logError(),
			icon:'none'
		});
		//重新登录初始化量子参数
		uni.$emit('init_Qss_Login',true)
		
		return
	}
	// 5 base64解码得到真实文件无加密
	let stream=quantum.Base64Decode(str.data)
	console.log('base64解码',stream.slice(0,55));
	let base64 = stream
	return base64
}



/*
国科量子解密文字
需要传入解密的字符串和秘钥secretKey
*/
function SM4DecryptBigDataText(secretData, secretKey) {
	console.log('国科量子解密');
	let session=init()
	console.log(secretData);
	console.log(secretKey);
	let str = quantum.SM4DecryptBigData(session, secretData, secretKey); //解密
	console.log(str);
	if(str.length<0){
		uni.showToast({
			title: '解密异常，'+quantum.logError(),
			icon:'none'
		});
		//重新登录初始化量子参数
		uni.$emit('init_Qss_Login',true)
		return
	}
	return str
}
//base64解码
function QSSBase64(str){
	//base64解码
	let atob=quantum.Base64Decode(str)
	console.log(atob);
	try{
		atob=JSON.parse(atob)
	}catch(e){
		//TODO handle the exception
	}
	return atob
}
//下载文件
function download_data(url) {
	return new Promise((reslove, reject) => {
		uni.downloadFile({
			url: url,
			success: (res) => {
				// console.log(res);
				if (res.statusCode === 200) {
					// console.log('下载成功');
					reslove(res)
				}else if(res.statusCode === 400){
					uni.showToast({
						title: '下载链接异常',
						icon:'none'
					});
				}
			},
			fail(error) {
				console.log('下载失败',error);
				reject(error)
			}
		});
	})
}
//读取文件的数据内容，并将数据内容进行URL编码readAsDataURL
function readAsDataURL(tempFilePath) {
	return new Promise((reslove, reject) => {
		// 通过URL参数获取目录对象或文件对象
		plus.io.resolveLocalFileSystemURL(tempFilePath, function(entry) {
			// 可通过entry对象操作文件 
			entry.file(function(file) {
				// 文件系统中的读取文件对象，用于获取文件的内容
				var fileReader = new plus.io.FileReader();
				//读取文件的数据内容，并将数据内容进行URL编码。【url相当于base64编码】
				fileReader.readAsDataURL(file,'utf-8');
				fileReader.onloadend = function(evt) {
					//去除头部data:image/jpg;base64,留下base64编码后的字符串
					let index=evt.target.result.indexOf(',')
					let str=evt.target.result.slice(index+1,evt.target.result.length)
					// console.log("文件流读取完成"+tempFilePath,evt.target.result);
					// console.log('url解码'+tempFilePath,decodeURI(evt.target.result));
					// console.log("evt.target" + evt.target);//文件对象
					// console.log('111',evt.target.result);//文件流
					// console.log(evt.target.length);
					// console.log(evt.target.result.length);
					reslove(str)
					// reslove(evt.target.result)
				}
				fileReader.onerror=function(error) {
					console.log("读取文件失败" + JSON.stringify(error));
				}
				
				// console.log(file.size + '--' + file.name);
			});
		}, function(e) {
			console.log("Resolve file URL failed: " + e.message);
			reject(e.message)
		});
	})
}
//以文本格式读取文件数据内容readAsText
function readAsText(tempFilePath) {
	return new Promise((reslove, reject) => {
		// 通过URL参数获取目录对象或文件对象
		plus.io.resolveLocalFileSystemURL(tempFilePath, function(entry) {
			// 可通过entry对象操作文件 
			entry.file(function(file) {
				// 文件系统中的读取文件对象，用于获取文件的内容
				var fileReader = new plus.io.FileReader();
				//以文本格式读取文件数据内容
				fileReader.readAsText(file,'utf-8');
				fileReader.onloadend = function(evt) {
					let str=evt.target.result
					reslove(str)
				}
				fileReader.onerror=function(error) {
					console.log("读取文件失败" + JSON.stringify(error));
				}
			});
		}, function(e) {
			console.log("Resolve file URL failed: " + e.message);
			reject(e.message)
		});
	})
}


/*
国科量子加密【字符串】
需要传入加密的字符串
*/
function SM4EncryptBigData(secretData) {
	console.log('国科量子加密');
	return new Promise((result,reject)=>{
		let session=init()
		//base64编码
		let base64=quantum.Base64Encode(secretData)
		//去除base64的回车和换行符
		base64=base64.replace(new RegExp('\n', 'g'),'')//换行
		base64=base64.replace(new RegExp('\r', 'g'),'')//回车
		let res = quantum.SM4EncryptBigData(session, base64) //加密
		console.log('session=',session, '\r\n 加密结果', res.length, '\r\n 错误码', quantum.logError());
		if(res.length<0) {//出错了可能session失效了
			uni.showToast({
				title: '错误码'+quantum.logError(),
				icon:"none"
			});
			reject('会话失效了')
		}
		result(res)
	})
}
/*
国科量子加密【图片】
需要传入加密的文件临时路径
*/
async function SM4EncryptBigDataImage(tempFilePath) {
	console.log('国科量子图片加密');
	let session=init()
	//1读取文件流
	let fileStream=await resolveLocalFileSystemURL(tempFilePath)
	//2 base64加密
	let base64=quantum.Base64Encode(fileStream)
	//去除base64的回车和换行符
	base64=base64.replace(new RegExp('\n', 'g'),'')//换行
	base64=base64.replace(new RegExp('\r', 'g'),'')//回车
	return new Promise((result,reject)=>{
		let res = quantum.SM4EncryptBigData(session, base64) //加密
		console.log('session=',session, '\r\n 加密结果', res.data.slice(0,50), '\r\n 错误码', quantum.logError());
		if(res.length<0) {//出错了可能session失效了
			uni.showToast({
				title: '错误码'+quantum.logError(),
				icon:"none"
			});
			reject('会话失效了')
		}
		result(res)
	})
}


function initQSS(pub, pri, kek, zmk) {
	//加解密必须再走init()
	let session=init()
	console.log('会话session', session); 
	uni.setStorageSync('GK_session', session)
	//quantum.prepSymmKey(that.session);//加密解密之前必须调用一次此方法，生产密钥
	console.log(pub);
	console.log(pri);
	console.log(kek);
	console.log(zmk);
	let ret = quantum.setUsbKey(session, pub, pri, kek, zmk)

	if (ret != 0) {
		console.log('出错了', ret);
		return
	}

}

let bInit = false;
let session = "";
function init(){
	if(!bInit) {
		let path=plus.io.convertLocalFileSystemURL('_www/static/cfg/skfapi.cfg');
		let ret = quantum.loadKey(path) //加载密钥
		if (ret != 0) {
			console.log('出错了', ret);
			return
		}
		ret = quantum.open() //初始化“模拟的USB设备”环境
		if (ret != 0) {
			console.log('出错了', ret);
			return
		}
		let devices = quantum.listDevices(); //获取设备名称
		if (devices == '') {
			console.log('devices出错了');
			return
		}
		quantum.connDevice(devices)
		session = quantum.getSession() //会话
		if (session == '') {
			console.log('session出错了');
			return
		}
		bInit = true;
	}
	return session
}

module.exports = {
	qssList,
	SM4DecryptBigData,
	SM4EncryptBigData,
	SM4DecryptBigDataText,
	SM4EncryptBigDataImage,
	SM4DecryptBigDataEnclosure,
	QSSBase64,
	initQSS,
}
